Przewidywanie satysfakcji klientów linii lotniczej
Wstęp oraz cel badania
Każdego dnia na całym świecie odbywa się około 100 000 lotów pasażerskich, co skutkuje podróżami około 6 milionów osób dziennie. Analizowany zbiór danych zawiera informacje pozyskane od około 100 tys. pasażerów na temat satysfakcji z odbytego lotu samolotem. W tym badaniu przeprowadzona zostanie eksploracyjna analiza danych, zaprezentowane będą wizualizacje zbioru oraz zbudowany zostanie model predykcyjnego poziomu satysfakcji z odbytego lotu.
Poniżej zaprezentowano opis poszczególnych zmiennych:
Gender: płeć pasażerów (Female,Male)Customer Type: typ klienta (Loyal customer,disloyal Customer)Age: wiek pasażeraType of Travel: powód lotu pasażera (Personal travel,Business travel)Class: klasa w samolocie podczas lotu pasażera (Business,Eco,Eco Plus)Flight distance: przebyty dystans podczas podróżyInflight wifi service: poziom zadowolenia z usługi wifi podczas lotu (0 - nie dotyczy ;1 - 5)Departure/Arrival time convenient: poziom zadowolenia z dogodnego czasu odlotu/przylotu (1 - 5)Ease of Online booking: poziom zadowolenia z rezerwacji online (1 - 5)Gate location: poziom zadowolenia z lokalizacji bramy (1 - 5)Food and drink: poziom zadowolenia z jedzenia oraz picia (1 - 5)Online boarding: poziom zadowolenia z odprawy online (1 - 5)Seat comfort: poziom zadowolenia z komfortu siedzenia (1 - 5)Inflight entertainment: poziom zadowolenia z rozrywki pokładowej (1 - 5)On-board service: poziom zadowolenia z usług pokładowych (1 - 5)Leg room service: poziom zadowolenia z obsługi pokoju Leg (1`- 5)Baggage handling: poziom zadowolenia z obsługi bagażu (1 - 5)Check-in service: poziom zadowolenia z usługi odprawy (1 - 5)Inflight service: poziom zadowolenia z obsługi podczas lotu (1 - 5)Cleanliness: poziom zadowolenia z czystości (1 - 5)Departure Delay in Minutes: minuty opóźnienia podczas odlotuArrival Delay in Minutes: minuty opóźnienia po przylociesatisfaction: poziom zadowolenia z linii lotniczych (satisfied,neutral or dissatisfied)
Preprocessing
Opis zbioru badawczego
Wstępna struktura danych przedstawia się następująco:
'data.frame': 103904 obs. of 26 variables:
$ X.1 : int 1 2 3 4 5 6 7 8 9 10 ...
$ X : int 0 1 2 3 4 5 6 7 8 9 ...
$ id : int 70172 5047 110028 24026 119299 111157 82113 96462 79485 65725 ...
$ Gender : chr "Male" "Male" "Female" "Female" ...
$ Customer.Type : chr "Loyal Customer" "disloyal Customer" "Loyal Customer" "Loyal Customer" ...
$ Age : int 13 25 26 25 61 26 47 52 41 20 ...
$ Type.of.Travel : chr "Personal Travel" "Business travel" "Business travel" "Business travel" ...
$ Class : chr "Eco Plus" "Business" "Business" "Business" ...
$ Flight.Distance : int 460 235 1142 562 214 1180 1276 2035 853 1061 ...
$ Inflight.wifi.service : int 3 3 2 2 3 3 2 4 1 3 ...
$ Departure.Arrival.time.convenient: int 4 2 2 5 3 4 4 3 2 3 ...
$ Ease.of.Online.booking : int 3 3 2 5 3 2 2 4 2 3 ...
$ Gate.location : int 1 3 2 5 NA 1 3 4 2 4 ...
$ Food.and.drink : int 5 1 5 2 4 1 2 5 4 2 ...
$ Online.boarding : int 3 3 5 2 5 2 2 5 3 3 ...
$ Seat.comfort : int 5 1 5 2 5 1 2 5 3 3 ...
$ Inflight.entertainment : int 5 1 5 2 3 1 2 5 1 2 ...
$ On.board.service : int 4 1 4 2 3 3 3 5 1 2 ...
$ Leg.room.service : int 3 5 3 5 4 4 NA 5 2 3 ...
$ Baggage.handling : int 4 3 4 3 4 4 4 5 1 4 ...
$ Checkin.service : int 4 1 4 1 3 4 3 NA 4 4 ...
$ Inflight.service : int 5 4 4 4 3 4 5 5 1 3 ...
$ Cleanliness : int 5 1 5 2 3 1 2 4 2 2 ...
$ Departure.Delay.in.Minutes : int 25 1 0 11 0 0 9 4 0 0 ...
$ Arrival.Delay.in.Minutes : int 18 6 0 9 0 0 23 0 0 0 ...
$ satisfaction : chr "neutral or dissatisfied" "neutral or dissatisfied" "satisfied" "neutral or dissatisfied" ...
Dane zawierają zatem 103904 obserwacji, które opisuje 26 zmiennych. Widoczne są zmienne X.1, X oraz id, które są indeksami wierszy. Wyminienione 3 kolumny zostaną usunięte ze zbioru, ponieważ nie wnoszą one żadnych informacji nt. danych, a format data.frame w R automatycznie indeksuje wiersze.
Dodatkowo, dostrzec można również zmienne zawierające ciągi znaków, które są zakodowane jako typ char (znakowy), co jest oczywiście logiczne, jednak każda z tych zmiennych ma swoje unikalne kategorie (wnioskując z opisu zmiennych), dlatego ich typ zostanie zmieniony na factor (kategoryczny). Poza tym, w dalszych etapach zakodowanie ich w ten sposób znacząco ułatwi analizę. Są to zmienne: Gender, Customer.Type, Type.of.Travel, satisfaction oraz Class.
Zatem zmienna Gender ma poziomy: 1 - Female, 0 - Male, Customer.Type : 0 - disloyal Customer, 1 - Loyal Customer, Type.of.Travel: 1 - Business travel, 0 - Personal Travel, Class: 1 - Eco, 2 - Eco Plus, 3 - Business, satisfaction: 0 - neutral or dissatisfied, 1 - satisfied.
Zmiennymi numerycznymi w tym zbiorze danych są: Age, Flight.Distance, Departure.Delay.in.Minutes, Arrival.Delay.in.Minutes. Pozostałe zostaną zakodowane jako kategoryczne.
Statystyki opisowe
Poniżej zostały przedstawione podstawowe statystyki opisowe dla zmiennych numerycznych.
| Age | Flight.Distance | Departure.Delay.in.Minutes | Arrival.Delay.in.Minutes | |
|---|---|---|---|---|
| Min. | 7.00 | 31 | 0.00 | 0.00 |
| 1st Qu. | 27.00 | 414 | 0.00 | 0.00 |
| Median | 40.00 | 842 | 0.00 | 0.00 |
| Mean | 39.38 | 1189 | 14.81 | 15.19 |
| 3rd Qu. | 51.00 | 1741 | 12.00 | 13.00 |
| Max. | 85.00 | 4983 | 1592.00 | 1584.00 |
| NA's | 435 | 399 | 439 | 722 |
Wnioski:
Najmłodszy pasażer w tym zbiorze danych miał 7 lat, a najstarszy 85, jednak średnia oraz mediana wieku wynoszą około 40 lat. Ich wartości są do siebie bardzo zbliżone, co może wstępnie świadczyć o braku asymetrii rozkładu tej zmiennej.
Loty zwykle odbywały się na dystans ponad 1000 kilometrów. 75% wszystkich lotów nie przekroczyło dystansu 1741 km. Odbyły się jednak loty, dla których miejsce docelowe było znacznie bardziej oddalone - wartość maksymalna wskazuje na dystans niemal 5 tys. kilometrów. Świadczy to także dodatkowo o asymetrii rozkładu tej zmiennej.
Dla zmiennych dotyczących opóźnień lotów, zwykle typowe wartości wynosiły 0 - opóźnienia w lotach nie występowały. 75% analizowanych lotów miało opóźnienie nie przekraczające 13 minut. Wartości maksymalne dla tych zmiennych świadczą jednak o występujących tu wartościach nietypowych - był co najmniej jeden lot, którego opóxnienie przekraczało 1500 minut.
Na podstawie powyższej tabeli, można także dostrzec, że każda ze zmiennych numerycznych posiada braki danych, których identyfikacja oraz imputacja będzie przeprowadzona w kolejnym etapie.
Liczby wystąpień poszczególnych poziomów dla zmiennych kategorycznych
Dla zmiennych kategorycznych prezentujemy ich możliwe poziomy, oraz liczby wystąpień każdego poziomu:
| Gender | Customer.Type | Type.of.Travel | Class | Inflight.wifi.service | Departure.Arrival.time.convenient | Ease.of.Online.booking | Gate.location | Food.and.drink | Online.boarding | Seat.comfort | Inflight.entertainment | On.board.service | Leg.room.service | Baggage.handling | Checkin.service | Inflight.service | Cleanliness | satisfaction | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 :50972 | 0 :18907 | 0 :32122 | 1 :46531 | 0 : 3083 | 0 : 5278 | 0 : 4469 | 0 : 1 | 0 : 107 | 0 : 2421 | 0 : 1 | 0 : 14 | 0 : 3 | 0 : 471 | 1 : 7198 | 0 : 1 | 0 : 3 | 0 : 12 | 0:58879 | |
| 1 :52506 | 1 :84593 | 1 :71353 | 2 : 7470 | 1 :17766 | 1 :15433 | 1 :17450 | 1 :17497 | 1 :12775 | 1 :10643 | 1 :12024 | 1 :12422 | 1 :11807 | 1 :10306 | 2 :11472 | 1 :12843 | 1 : 7049 | 1 :13255 | 1:45025 | |
| NA's: 426 | NA's: 404 | NA's: 429 | 3 :49449 | 2 :25732 | 2 :17129 | 2 :23930 | 2 :19386 | 2 :21890 | 2 :17422 | 2 :14835 | 2 :17577 | 2 :14627 | 2 :19429 | 3 :20545 | 2 :12840 | 2 :11412 | 2 :16046 | ||
| NA's: 454 | 3 :25770 | 3 :17898 | 3 :24357 | 3 :28461 | 3 :22214 | 3 :21718 | 3 :18631 | 3 :19054 | 3 :22742 | 3 :20015 | 4 :37212 | 3 :28312 | 3 :20206 | 3 :24475 | |||||
| 4 :19698 | 4 :25431 | 4 :19494 | 4 :24344 | 4 :24254 | 4 :30619 | 4 :31638 | 4 :29294 | 4 :30741 | 4 :28670 | 5 :27027 | 4 :28930 | 4 :37783 | 4 :27053 | ||||||
| 5 :11420 | 5 :22297 | 5 :13783 | 5 :13817 | 5 :22222 | 5 :20641 | 5 :26355 | 5 :25099 | 5 :23571 | 5 :24572 | NA's: 450 | 5 :20538 | 5 :27004 | 5 :22581 | ||||||
| NA's: 435 | NA's: 438 | NA's: 421 | NA's: 398 | NA's: 442 | NA's: 440 | NA's: 420 | NA's: 444 | NA's: 413 | NA's: 441 | NA's: 440 | NA's: 447 | NA's: 482 |
Zmienne dotyczące satysfakcji z lotu mają 5 poziomów. Pozostałe, dotyczące samych pasazerów, zwykle 2-3 poziomy. Dla każdej zmiennej, poza satisfaction, występują braki danych.
Braki danych
Liczba braków danych w każdej z kolumn:
Gender Customer.Type
426 404
Age Type.of.Travel
435 429
Class Flight.Distance
454 399
Inflight.wifi.service Departure.Arrival.time.convenient
435 438
Ease.of.Online.booking Gate.location
421 398
Food.and.drink Online.boarding
442 440
Seat.comfort Inflight.entertainment
420 444
On.board.service Leg.room.service
413 441
Baggage.handling Checkin.service
450 440
Inflight.service Cleanliness
447 482
Departure.Delay.in.Minutes Arrival.Delay.in.Minutes
439 722
satisfaction
0
[1] 9819
W niemal wszystkich kolumnach występuje około 400 braków danych. Najwięcej ich występuje w zmiennej Arrival.Delay.in.Munutes. Jedyna zmienna bez braków to satisfaction. W całym zbiorze danych braki stanowią 9819 przypadków.
Wyświetlona zostanie teraz liczba niekompletnych wierszy w całym zbiorze (co najmniej jedna brakująca wartość).
[1] 9591
Takich wierszy jest 9591.
Usunięcie niemal dziesięcu tysięcy ze zbioru uważam za złą praktykę. Każdy z nich zawiera pewne informacje o pasażerach, które są cenne w analizie. Posatram się je zatem uzupełnić, stosując odpowiednią technikę.
Przykładowe sposoby imputacji braków danych to imputacja średnią, medianą, elementem najczęściej występujacym lub metodą \(k\)-najbliższych sąsiadów.
Przed zdecydowaniem się na konkretną metodę imputacji, przyjrzę się zależnościom między zmiennymi oraz zbadam ich rozkłady.
Na podstawie widocznej wyżej macierzy korelacji, warto zauważyć silną korelację pomiędzy zmienną Arrival.Delay.in.Minutes oraz Departure.Delay.in.Minutes. Jest to korelacja naturalna, ponieważ oczywiste jest, że opóźnienie wylotu samolotu związane jest z opóźnienniem jego przylotu, jednak ostatecznie w modelowaniu warto uwzględnić tylko jedną z nich, aby nie przekazywać nadmiarowych informacji.
Dla zmiennych kategorycznych widoczne są silne korelacje pomiędzy zmiennymi Cleanliness i Seat.comfort oraz Inflight.enternainment, a także silna korelacja pomiędzy zmiennymi Ease.of.Online.booking i Inflight.wifi.service. Zmienna wynikowa safisfaction najsilniejszą korelację ma ze zmiennymi Class oraz Online.boarding, z pozostałymi zmiennymi ma ona słabe korelacje.
Na przyszłość można rozszerzyć to badanie o przeprowadzenie metody PCA dla wysokoskorelowanych par zmiennych.
Rozkłady zmiennych
Poniżej zaprezentowano rozkłady zmiennych numerycznych oraz kategorycznych.
Na podstawie powyższych wykresów wnioskujemy, że:
płeć pasażerów jest zbalansowana, co oznacza, że liczebność kobiet i mężczyzn jest bardzo podobna,
widoczne jest niezbalansowanie zmiennych
Customer.Type,Type.of.TravelorazClass,zmienna
satisfactionnie jest zbalansowana, ale też nie ma znaczącej różnicy pomiędzy liczebnością pasażerów usatysfakcjonowanych, a neutralnie- lub nieusatysfakcjonowanych,widoczna jest symetria rozkładu zmiennej
Age- jest on zbliżony do rozkładu normalnego - zostało to także wstępnie przewidziane wcześniej, na etapie statystyk opisowych,widoczna jest prawostronna asymetria rozkładu zmiennych
Arrival.Deyal.in.Minutes,Departure.Delay.in.MinutesorazFlight.Distance,widoczna jest lewostronna asymetria rozkładów zmiennych
Arrival.time.convenient,Food.and.drink,Online.borading,Seat.comfort,Inflight.entertainment,On.board.service,Leg.room.service,Baggage.handling,Checkin.service,Inflight.serviceorazCleanliness,widoczne są także wartości odstające (szczególnie dla zmiennej
Customer.Type).
Ze względu na asymetrię rozkładów zmiennych ilościowych, odrzucam dla nich imputację metodą najczęściej występującej wartości. Zastosuję dla nich dwie metody imputacji - \(k\)-najbliższych sąsiadów (tu 5) oraz zastępowanie braków danych medianą (później przetestuję wyniki modelu na zbiorach z alternatywnymi sposobami imputacji danych celem porównania). Do zmiennych jakościowych zastosuję uzupełnianie braków danych najczęściej występującą wartością.
[1] 0
[1] 0
Wartości odstające
W tej części badania zostaną zbadane oraz zidentyfikowane wartości odstające.
Za pomocą funkcji nearZeroVar() zidentyfikować można predyktory, które mają bardzo mało unikalnych wartości w stosunku do ich liczby, a stosunek częstotliwości najczęściej występującej wartości do częstotliwości drugiej najczęściej występującej wartości jest duży.
[1] 21 22
| Departure.Delay.in.Minutes | Arrival.Delay.in.Minutes |
|---|---|
| 25 | 18 |
| 1 | 6 |
| 0 | 0 |
| 11 | 9 |
| 0 | 0 |
| 0 | 0 |
Tutaj takimi predyktorami są zmienne Departure.Delay.in.Minutes oraz Arrival.Delay.in.Minutes.
$linearCombos
list()
$remove
NULL
Brak jest również w tym zbiorze danych kombinacji liniowych pomiędzy predyktorami.
Poniżej przedstawiono wykresy ramka-wąsy dla zmiennych numerycznych w tym zbiorze.
Zauważyć można niesymetryczność rozkładów niektórych zmiennych, które były widoczne także na poprzednich wizualizacjach. Widać także dużo obserwacji, które zostały sklafyfikowane jako odstające na podstawie zasady rozstępu ćwiartkowego.
Teraz, za pomocą funkcji identify_outliers(), zidentyfukowane zostaną wartości odstające.
Obserwacje zidentyfikowane jako odstające pochodzą ze zmiennych Arrival.Delay.in.Minutes - 8618, Departure.Delay.in.Minutes - 9276, Flight.Distance - 2329, Customer.Type - 18907. Łącznie zatem takich obserwacji jest niemal 40 tysięcy. Niepoprawnym byłoby usunięcie wszystkich tych obserwacji, ponieważ stanowią one znaczną część załego zbioru danych. Na ten moment decyduję się na nie podejmowanie żadnych kroków pod tym względem.
W związku z tym, że około 40% zbioru zostało zakwalifikowane jako wartości odstające, a imputacja braków danych medianą jest odporna na wartości odstające, pokazuje to dobry wybór co do właśnie tej metody imputacji.
Dodatkowe wizualizacje
Na podstawie tego wykresu można powiedzieć, że najczęściej usatysfakcjonowane były osoby starsze (w wieku 40-60 lat). Drugą grupę w znacznej mierze reprezentują pasażerowanie w wieku 20-40 lat.
Wśród badanych pasażerów, zarówno w grupie usatysfakcjonowanych, jak i neutralnych lub nieusatysfakcjonowanych, podział płci był rówomiernie rozłożony.
Na podstawie powyższego wykresu można powiedzieć, że największym zainteresowaniem w każdej grupie wiekowej cieszyła się klasa Eco. Klasy Bisuness oraz Eco Plus wybierała podobna liczba pasażerów.
Przygotowanie danych do budowy modelu
Wybór danych do modelu
Należy uwzględnić predyktory, które są silnie skorelowane ze zmienną docelową i nie są skorelowane ze sobą.
Na ten moment decyduję się na nie uwzględnienie w modelu zmiennej Departure.Delay.in.Minutes, ponieważ była ona bardzo silnie skorelowana ze zmienną Arrival.Delay.in.Minutes.
Preprocessing
W kolejnych korkach preprocessingu podzielimy dane na zbiór uczący i testowy, dokonamy transformacji rozkładów predyktorów do rozkładu normalnego oraz normalizacji predyktorów. Ponieważ planuję sprawdzić różne modele, a każdy z nich wymaga nieco innego preprocessingu, to przygotuję różne formuły transformacji danych - odpowiednie dla poszczególnych modeli.
Budowa modeli
Najpierw wyznaczymy tzw. model bazowy. Używa się go do sprawdzenia, czy modele uczenia maszynowego faktycznie przewyższają dopasowaniem model bazowy. Tylko wtedy warto je rozważać.
Do oceny jakości dopasowania użyjemy dwóch miar accuracy oraz specificity. Oceny dopasowania dokonamy z wykorzystaniem sprawdzianu krzyżowego 5-krotnego bez powtórzeń.
| .metric | .estimator | mean | n | std_err | .config |
|---|---|---|---|---|---|
| accuracy | binary | 0.5666694 | 5 | 0.0013454 | Preprocessor1_Model1 |
| spec | binary | 0.0000000 | 5 | 0.0000000 | Preprocessor1_Model1 |
| .metric | .estimator | mean | n | std_err | .config |
|---|---|---|---|---|---|
| accuracy | binary | 0.5666694 | 5 | 0.000992 | Preprocessor1_Model1 |
| spec | binary | 0.0000000 | 5 | 0.000000 | Preprocessor1_Model1 |
Na ten moment średnie wyniki miary accuracy dla obu wariantów danych (różne metody imputacji braków danych) dla modelu bazowego wynoszą około 57%.
Zbudowane teraz zostaną różne modele - lasu losowego, drzewa decyzyjnego, modelu \(k\)-najbliższych sąsiadów, regresji logistycznej, modelu SVM oraz sieci neuronowej.
# A workflow set/tibble: 12 × 4
wflow_id info option result
<chr> <list> <list> <list>
1 recipe_1_svm <tibble [1 × 4]> <opts[0]> <list [0]>
2 recipe_1_rf <tibble [1 × 4]> <opts[0]> <list [0]>
3 recipe_1_knn <tibble [1 × 4]> <opts[0]> <list [0]>
4 recipe_1_rpart <tibble [1 × 4]> <opts[0]> <list [0]>
5 recipe_1_logreg <tibble [1 × 4]> <opts[0]> <list [0]>
6 recipe_1_neural <tibble [1 × 4]> <opts[0]> <list [0]>
7 recipe_2_svm <tibble [1 × 4]> <opts[0]> <list [0]>
8 recipe_2_rf <tibble [1 × 4]> <opts[0]> <list [0]>
9 recipe_2_knn <tibble [1 × 4]> <opts[0]> <list [0]>
10 recipe_2_rpart <tibble [1 × 4]> <opts[0]> <list [0]>
11 recipe_2_logreg <tibble [1 × 4]> <opts[0]> <list [0]>
12 recipe_2_neural <tibble [1 × 4]> <opts[0]> <list [0]>
Dopasowanie do zbioru treningowego:
# A tibble: 24 × 9
wflow_id .config preproc model .metric .estimator mean n std_err
<chr> <chr> <chr> <chr> <chr> <chr> <dbl> <int> <dbl>
1 recipe_1_svm Preproc… recipe svm_… accura… binary 0.955 5 7.38e-4
2 recipe_1_svm Preproc… recipe svm_… specif… binary 0.932 5 1.05e-3
3 recipe_1_rf Preproc… recipe rand… accura… binary 0.960 5 9.27e-4
4 recipe_1_rf Preproc… recipe rand… specif… binary 0.939 5 7.78e-4
5 recipe_1_knn Preproc… recipe near… accura… binary 0.930 5 8.68e-4
6 recipe_1_knn Preproc… recipe near… specif… binary 0.908 5 1.15e-3
7 recipe_1_rpart Preproc… recipe deci… accura… binary 0.888 5 3.64e-3
8 recipe_1_rpart Preproc… recipe deci… specif… binary 0.906 5 2.73e-3
9 recipe_1_logreg Preproc… recipe logi… accura… binary 0.933 3 7.50e-4
10 recipe_1_logreg Preproc… recipe logi… specif… binary 0.912 3 1.63e-3
# ℹ 14 more rows
# A tibble: 24 × 9
wflow_id .config preproc model .metric .estimator mean n std_err
<chr> <chr> <chr> <chr> <chr> <chr> <dbl> <int> <dbl>
1 recipe_1_svm Preproc… recipe svm_… accura… binary 0.954 5 1.28e-3
2 recipe_1_svm Preproc… recipe svm_… specif… binary 0.930 5 2.37e-3
3 recipe_1_rf Preproc… recipe rand… accura… binary 0.959 5 1.07e-3
4 recipe_1_rf Preproc… recipe rand… specif… binary 0.935 5 1.88e-3
5 recipe_1_knn Preproc… recipe near… accura… binary 0.928 5 8.65e-4
6 recipe_1_knn Preproc… recipe near… specif… binary 0.906 5 1.51e-3
7 recipe_1_rpart Preproc… recipe deci… accura… binary 0.896 5 1.67e-3
8 recipe_1_rpart Preproc… recipe deci… specif… binary 0.901 5 1.49e-3
9 recipe_1_logreg Preproc… recipe logi… accura… binary 0.932 3 1.09e-3
10 recipe_1_logreg Preproc… recipe logi… specif… binary 0.914 3 3.04e-3
# ℹ 14 more rows
Najlepsze wartości dopasowania uzyskał model lasu losowego (96% miary accuracy). Na bardzo zbliżonym poziomie do tego pozostały także wyniki modelu SVM. Warto również zaznaczyć, że przewyższają one zdecydowanie jakością dopasowania model bazowy.
Należy także zwrócić uwagę, że wyniki models2 oparte są na zestawie danych, gdzie metodą imputacji braków danych była metoda 5-najbliższych sąsiadów. Wyniki dla dopasowania modeli dla tych danych wypadają bardzo podobnie do tych, gdzie braki danych były uzupełniane medianą. Różnice są na 3. miejscu po przecinku (z przewagą dla metody uzupełniania bd medianą).
Tuning modeli
W tej części pracy przeprowadzona zostanie optymalizacja parametrów najlepszego modelu. Do optymalizacji zostanie wykorzystana metoda przeszukiwania siatki. Tuningowany będzie model lasu losowego. Od tej pory będziemy też pracować tylko na zbiorze dane, gdzie imputacja braków danych przebiegała z użyciem mediany.
# A tibble: 5 × 9
mtry trees min_n .metric .estimator mean n std_err .config
<int> <int> <int> <chr> <chr> <dbl> <int> <dbl> <chr>
1 15 1790 8 accuracy binary 0.961 5 0.000489 Preprocessor1_Mode…
2 10 1578 20 accuracy binary 0.961 5 0.000466 Preprocessor1_Mode…
3 13 126 15 accuracy binary 0.961 5 0.000446 Preprocessor1_Mode…
4 7 1151 11 accuracy binary 0.961 5 0.000580 Preprocessor1_Mode…
5 17 209 25 accuracy binary 0.961 5 0.000333 Preprocessor1_Mode…
W wyniku przeszukiwania siatki, otrzymano 5 propozycji optymalnych hiperparametrów modelu lasu losowego; każda z nich ma średnią miarę accuracy wynoszącą 0,96.
Ocena dopasowania modelu końcowego
Jako najlepsze hiperparametry modelu zostaną wybrane te na pozycji pierwszej.
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: rand_forest()
── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps
• step_best_normalize()
• step_normalize()
── Model ───────────────────────────────────────────────────────────────────────
Random Forest Model Specification (classification)
Main Arguments:
mtry = 15
trees = 1790
min_n = 8
Computational engine: ranger
Dopasowanie do zbioru testowego.
[[1]]
# A tibble: 3 × 4
.metric .estimator .estimate .config
<chr> <chr> <dbl> <chr>
1 accuracy binary 0.962 Preprocessor1_Model1
2 roc_auc binary 0.994 Preprocessor1_Model1
3 brier_class binary 0.0280 Preprocessor1_Model1
Dopasowanie do danych testowych na podstawie miary accuracy wynosi 0,96. Pole pod krzywą ROC wynosi niemal 1.
Poniżej przedstawiono macierz klasyfikacji.
Truth
Prediction 0 1
0 17306 815
1 358 12693
Podsumowanie
Model lasu losowego ze stuningowanymi hiperparametrami poskutkował 96% dopasowaniem do danych testowych. Na przyszłość można rozważyć także tuning pozostałych równie dobrze dopasowanych modeli, który nie został tutaj wdrożony.